GSP-007 Set Up Network and HTTP Load Balancers

2017 10 25일 수요일

오전 9:10

링크: https://qwiklabs.com/focuses/6478

 

오버뷰

 

두개의 Load balacer가 있고, 여기서는 둘 다 살펴본다.

- L3 Network Load Balancer

- L7 HTTP(s) Load Balancer

 

할일은

1) network load balancer 설정

2) HTTP(s) load balancer 설정

3) 실습을 통한 두 발란서간의 차이를 배워보기

 

Create multiple web server instances

 

일단 서버들이 있어야 그들간의 발란스를 맞추지

 

1) Nginx 서버 클러스터를 만들고

2) 이 서버들이 Instance Templates Managed Instance Group 을 이용한 Static content를 제공하게 한다

- Instance Template: VM 스펙 설정

- Manged Instance Group: Instance Template에서 설정한 VM instance로 맹근다

 

First, VM들이 사용할 Nginx 서버 시작시 사용할 스크립트를 만들자

1) nginx을 인스톨하고

2) 시작한다

3) sed -I 이후의 명령은 좀 찾아보자

 

cat << EOF > startup.sh

#! /bin/bash

apt-get update

apt-get install -y nginx

service nginx start

sed --- 's/nginx/Google Cloud Platform - '"\$HOSTNAME"'/' /var/www/html/index.nginx-debian.html

EOF

Colored by Color Scripter

 

 

*sed = stream editor : https://www.gnu.org/software/sed/manual/sed.html

- grep 과 같은 필터이지만 파일을 수정할 수 있다. 대신에 ed 처럼 대화식 처리는 안된다.

- 1개 라인씩 입력라인을 받아들여서 표준출력으로 출력한다

 

sutstitute 사용예

sed 's/addrass/address/' list.txt : list.txt를 읽어서 addrass address로 바꾼다. , 원본파일을 바꾸지 않고 표준출력만 한다.

sed 's/\t/\ /' list.txt : list.txt를 읽어서 탭문자를 엔터로 변환

 

 

1) 따라서 위의 경우에는 /var/www/html/index.nginx-devian.html 파일을 읽어서

2) 해당항목 있으면 변경해서 출력, 없으면 그냥 그 라인 그대로 출력이고 원본파일은 변경되지 않아야 하지만

3) -i 옵션이라 파일 자체를 수정한다

nginx 를 만나면 Google Cloud Platform - '"\$HOSTNAME"' 로 수정해준다.

 

여기까지 스크립트 startup.sh 작성완료

나중에 VM 인스턴스 생성후 확인해봄 $HOSTNAME은 런타임에 값이 들어가겠다

- 해보니 아니다 뭔가 잘못한듯…;;;

cat /var/www/html/index.nginx-debian.html 
!DOCTYPE html> 
html > 
heady 
title>WeIcome to Cloud Platform - 
$HOSTUAME ! 
style > 
body { 
width: 35em; 
margin: e auto; 
font-family: Tahoma, 
s tyle> 
'head> 
body > 
Verdana, 
Arial, 
sans -serif; 
to Google PI at-fn 
p>If you see this page, the Google Cloud Platform - $I-OSTNAHE 
orking. Further configuratiom is requireå=i 
p>For online documentation and support please refer to 
a href="http:/'Google Cloud Platform - $HOSTNAHE. 
ommercial support is available at 
a href="http://600gIe Cloud Platform - $HOSTNAHE 
you for using Google Cloud Platform - 
/body> 
'html> 
b server is successfully installed and

 

Second, startup.sh 사용할 Instance Template 만들자

1) nginx-template 라는 instance Template를 만들겠다

2) startup-script startup.sh 이다

gcloud compute instance-templates create nginx-template 
--metadata-from-file startup-script=startup.sh

 

여기까지

1) startup.sh 스크립트를 만들고

2) nginx-template 라는 instance-template startup.sh 로 만들었음

- 이것은 설계도이다

 

My Project 
Instance templates 
Filter instance templates 
Q 
Google Cloud Platform 
Compute Engine 
VM instances 
Instance groups 
Instance templates 
Disks 
Name A 
nginx-template 
Machine type 
1 vcpu, 375

Google Cloud Platform 
Compute Engine 
VM instances 
Instance groups 
My Project 
Instance templates 
nginx-template 
Machine type 
nl-standard-l (1 vCPlJ, 3.75 G8 memory) 
Creation time 
COPY 
CREATE INSTANCE GROUP

 

 

Third, target pool 만들자

- target pool을 만들면 그룹내의 모든 인스턴스에 대해 single access point를 가진다

- 이걸 기반으로 Load Balace를 할 거다

- nginx-pool 이라는 target-pool을 만들어라

 

여기까지

- 스크립트 만들고

- 스크립트로 템플리트 만들고

- 그거랑은 별개로 single access point를 가지는 target-pool 을 만듬 (이름은 nginx-pool)

-  참고로 region은 예제와 같이 europe-west1

 

Finally, managed instance group 만들자 뭘로? instance template (=설계도)

- nginx-group 이라는 managed instance-group을 만들겠다.

- 기본이 되는 instance name nginx 이다. nginx- 로 사직하는 인스턴스를 만들겠다는 거다 뒤에 숫자같은게 붙겠지?

- 2개 만들겠다

- template nginx-template를 만들겠다. 여기서 잠깐! template 라는건 일종의 간단 도커 이미지 같은걸?

- 그리고 nginx-pool에 연결하겠다 = single access point

gcloud compute instance-groups managed create nginx-group \ 
--base-instance-name nginx \ 
--size 2 \ 
--template nginx-template \ 
--target-pool nginx-pool

 

qwiklabs-gcp-5da36185am • 
VM instances 
Filter VIVI instances 
Q 
Google Cloud Platform 
Compute Engine 
VM instances 
Instance groups 
Instance templates 
Disks 
Snapshots 
CREATE INSTANCE 
Recommendation 
IMPORT VM 
Internal IP 
10.132_o.3 
10.132_o.2 
C REFRESH 
External IP 
Name A 
nginx-875v 
e nginx-v93m 
Zone 
europe-westl-ö 
euro.e-westl-d

 

현재는 External IP로 접근 안됨

 

나중에 방화벽 설정을 하는 대신

여기서 생성된 두 개의 VM 각각을 edit 하여 allow HTTP(s) 해줘도 되겠다.

 

 

시스템 생성 대체 텍스트:
1• qwiklabs-gcp-5da36185a… 
Load balancing 
nginx-pool 
보 
Google Cloud Platform 
Network services 
Load balancing 
Cloud DNS 
Cloud 00N 
亞 CREATE LOAD E 
㉦ Your load balancer has TCP/니DP mixer 
Frontend 
This |03d balancer has no frontend configured 
Backend 
Name: ngmx-pool Region: europe-westl 
This |03d balancer has no health check, 30 tra, 
Instance group ^ 
Instances 
nginx-V93m 
nginx-875v

 

 

 

Firewall 설정하기

- 80 포트로 들락거릴 수 있는 www-firewall 이라는 firewall-rules를 만들었음

- 이제 Project 내부의 80 포트 사용하는 놈들은 통과 가능?

 

그냥 룰만 만들어진 것임

Google Cloud Platform 
VPC network 
VPC networks 
External IP addresses 
Firewall rules 
Routes 
VPC network peering 
qwiklabs-gcp-5da36185am • 
Firewall rules 
CREATE FIREWALL RULE 
C REFRESH 
Firewall rules control incoming or outgoing traffic to an instance By default, 
incoming tramc from outside your network is blocked. Learn more 
Note: App Engine firewalls are managed here. 
Ingress Egress 
Name 
www-firewall 
Targets 
Applyto all 
Source filters 
IP ranges: 
tcp:8C

 

 

Create a Network Load Balancer

 

- 들어오는 IP 프로토콜 데이터를 기반으로 (= address, port, protocol type 등등) 시스템의 로드를 발란싱한다

- Network 로드 발란서는 HTTP(S)에서는 안되는 옵션도 지원한다

- 예를들면 TCP/UDP 기반 프로토콜 기반의 SMTP 같은 놈도 로드 발란싱 해준다

- TCP 연결에 기반한 특성에 관심이 있다면 로드 발란서는 앱에서 packer inspect를 하게 해준다

 

L3 Network Load Balancer 만들어보자

 

아까 보았던 nginx-pool 을 다시보면, 프론트엔드가 설정안되었다는 것을 알 수있다

Google Cloud Platform 
Network services 
Load balancing 
Cloud DNS 
Cloud CON 
qwiklabs-gcp-5da36185am • 
Load balancing 
e nginx-pool 
CREATE LOAD E 
O Your load balancer has TCP/UDP mixer 
Frontend 
This load balancer has no frontend configu 
Backend 
Name: nginx-pool 
Region: europe-westl 
This load balancer has no health check, so tra' 
Instance group A 
nginx-group 
Instances A 
nginx-v93m 
nginx-875v

 

 

- nginx-lb 라는 로드 발란서를 만드는데

- 지역은 유럽이고 ,포트는 80이며

- nginx-pool 이라는 target-pool = single access point로 들어오는 놈을 처리하도록 하자

gcloud compute forwarding-rules create nginx-lb 
--region europe-westl 
--portsz8B \ 
- -target-pool nginx-pool

 

그리고 아래와 같이 로드발란서를 확인할 수 있다

 

그리고 VPC network >> External IP Addresses 에서 확인 가능

- 맨 위꺼가 통합되어 들어오는 IP 이고 아래 두개로 로드 발란싱 해준다.

- 그런데 아래 두개로 direct로 들어올 수도 있다.

Google Cloud Platform 
VPC network 
VPC networks 
External IP addresses 
Firewall rules 
Routes 
qwiklabs-gcp-5da36185am 
External IP addresses 
RESERVE STATIC ADDRESS 
C REFRESH 
In use by 
RELEASE STATIC AD 
Name 
External Address 
13 
Region 
europe-westl 
europe-westl 
europe-westl 
Type v 
Ephemeral • 
Ephemeral • 
Ephemeral • 
Version 
Forwarding rule nginx-lb 
VM instance nginx-v93m (Zone d) 
VM instance nginx-875v (Zone b)

 

여기서도 확인가능

 

Google Cloud Platform 
Network services 
Load balancing 
Cloud DNS 
Cloud CON 
qwiklabs-gcp-5da36185am • 
Load balancing 
CREATE LOAD BALANCER 
Frontends 
C REFRESH 
Load balancers 
Backends 
Load balancer 
e nginx-pool 
Frontend 
Protocol A 
TCP 
Backend 
I p:port 
104.1 
Name: nginx-pool Region: europe-westl 
Session affinity None 
This load balancer has no health check, so traffic will be sent to all instances regardless of their status 
Instance group A 
nginx-group 
Instances A 
nginx-v93m 
nginx-875v 
104.199.100.76

 

(조금 마음에 안들지만) 여기까지 그림으로 정리해봄

1) Nginx 을 설치하고 실행하는 스크립트 짜고

2) 그걸로 nginx-template 라는 instance template = 설계도를 만듬

3) 여러 개의 instance를 만들어도 하나의 통로로 연결될 수 있는 target-pool nginx-pool을 만들고

4) nginx-group을 만듬

- VM nginx-template를 참고해서 nginx- 으로 시작하는 이름으로 생성

- nginx-pool 이라는 single access point를 사용하게 함

 

5) 우선 firewall rule을 하나 만들어서 80 포트를 사용가능하게 해둠

6) 마지막으로 nginx-lb라는 로드 발란서를 만들어서 nginx-pool과 연결해줌

 

이제는 single access point nginx-pool External IP VM 각각의 External IP로 접근이 가능해줌

一 一 Y 吖

 

 

Create a HTTP(s) Load Balancer

 

HTTP(s) Load Balancer   인스턴스로 들어오는 글로벌한 HTTP(s) request 를 처리해준다.

- 특정 URL 은 특정 인스턴스로 가게 rule을 정할 수 있다.

- Request user 에게서 가장 가까운 Instance group 으로 간다.

- 만약 캐파가 부족하다면 그 다음 가까운 Instance group 으로 간다

 

이제부터는 퀵랩 토큰 사용이 아닌 내 계정으로 해봄 - SDK 사용해서 해봄

 

계정확인, 프로젝트 확인

 

Health Check 만들기

- 인스턴스가 HTTP/HTTPS traffic 에 반응하는지 체크

 

 

포트에 이름붙여주기

gcloud compute instance-groups managed \ 
set-named-ports nginx-group \ 
--named-ports http:8B

 

백엔드 서비스 만들어주기

1) nginx-backend 라는 서비스가 만들어지는데

2) HTTP 프로토콜을 쓸것이며

3) 아까 만들어둔 http-basic-check 라는 헬스체크를 할거다. 글로벌하게

- , 80으로 들어오는 HTTP request 들에 잘 반응하는지 체크할거다

gcloud compute backend-services create nginx-backend \ 
--protocol HTTP --http-health-checks http-basic-check 
-- global

 

아까만든 Single Access Point nginx-pool 도 백엔드 서비스 였구나

Network services 
Load balancing 
Cloud DNS 
Cloud CON 
Load balancing 
Load balancers 
Backends 
CREATE LOAD BALANCER 
Frontends 
C REFRESH 
Scope 
Regional (us-centrall) 
Regional (us-centrall) 
Regional (us-centrall) 
Global 
Regional (asia-eastl) 
DELETE 
Protocol 
Filter by name or type 
Name A 
ac0002b8cb68d11e7bt7t42010a80014 
ac6d43424b67f11 e7a8d042010880013 
nginx-backend 
nginx-pool 
TYPe 
Backend service 
Backend service 
Backend service 
Backend service 
Backend service 
Load balancer 
le79 
ac0002b8cb68d1 lem 
ac6d43424b67f1 
nginx-pool

 

만든 백엔드인 nginx-backend

이미 만들어둔 인스턴스 그룹인 nginx-group 에 더해준다

 

gcloud compute backend-services add-backend nginx-backend 
--instance-group nginx-group \ 
--instance-group-zone europe-westl-c \ 
--global

 

디폴트 URL map을 만들자

web-map 이라고 만들고 nginx-backend와 붙여준다

- nginx-backend nginx-group과 붙어있지?

 

gcloud compute url-maps create web-map \ 
--default-service nginx-backend

 

그리고 target HTTP proxy를 만든다.

- Request를 내가 만들어둔 루트인 web-map 대로 가게 해주는 것이다.

gcloud compute target-http-proxies create http-lb-proxy 
--url-map web-map

 

Proxy를 적용하여 forwarding rulue을 적용해준다

- 실제로 적용되는 데는 몇 분이 걸린다

gcloud compute forwarding-rules create http-content-rule \ 
--g10ba1 \ 
--target-http-proxy http-lb-proxy \ 
-ports 88

 

 

 

 

 

 

 

 

 

 

 

 

Microsoft OneNote 2016에서 작성